package com.zhu.solution.stringQuestion;


/*实现 strStr()
实现 strStr() 函数。

给你两个字符串 haystack 和 needle ，请你在 haystack 字符串中找出 needle 字符串出现的第一个位置（下标从 0 开始）。如果不存在，则返回  -1 。

说明：
当 needle 是空字符串时，我们应当返回什么值呢？这是一个在面试中很好的问题。
对于本题而言，当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

示例 1：

输入：haystack = "hello", needle = "ll"
输出：2

示例 2：
输入：haystack = "aaaaa", needle = "bba"
输出：-1

示例 3：
输入：haystack = "", needle = ""
输出：0

提示：
0 <= haystack.length, needle.length <= 5 * 104
haystack 和 needle 仅由小写英文字符组成

*
* */
/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zhujiabao
 * @Date: 2021/12/21/10:10
 * @Description:
 */
public class StringSolution_7 {

    public static void main(String[] args) {
        String hayStack = "hello world";
        String needle = "ll";
        System.out.println(new StringSolution_7().strStr(hayStack,needle));
        System.out.println(new StringSolution_7().strStr_2(hayStack,needle));

        System.out.println(hayStack.indexOf(""));
        System.out.println(hayStack.indexOf(" "));
        System.out.println(hayStack.indexOf("  "));
    }

    /**
    * @Description: indexof查找，haystack：被查找的字符串，needle：查找的字符串
    * @Param: [haystack, needle]
    * @return: int
    * @Author: zhujiabao
    * @Date: 2021/12/21
    */
    public int strStr(String haystack, String needle) {

        int haystackLength = haystack.length();
        int needleLength = needle.length();

        //如果查找的字符串长度为0，直接返回0
        if (needleLength==0)
            return 0;

        //如果被查找的字符串长度 小于 查找的字符串长度，直接返回-1
        if (haystackLength < needleLength)
            return -1;

        for (int i=0; i<haystackLength; i++){

            for (int j=0; j<needleLength; j++){
                //补获异常，string不在范围内时
                try {
                    //当字符不等时跳出
                    if (haystack.charAt(i+j) != needle.charAt(j)){
                        break;
                    }
                }catch (StringIndexOutOfBoundsException e){
                    return -1;
                }

                //当全部都匹配时，返回此时的 被查找的字符串的序号
                if (j == needleLength-1){
                    return i;
                }
            }
        }

        return -1;
    }

    public int strStr_2(String haystack, String needle) {
        int haystackLength = haystack.length();
        int needleLength = needle.length();

        //如果查找的字符串长度为0，直接返回0
        if (needleLength==0)
            return 0;

        //如果被查找的字符串长度 小于 查找的字符串长度，直接返回-1
        if (haystackLength < needleLength)
            return -1;

        for (int i=0,j=0; i<haystackLength && j<needleLength;){

            if (haystack.charAt(i) != needle.charAt(j)){
                i=i-j+1;
                j=0;
                continue;
            }

            //当全部都匹配时，返回此时的 被查找的字符串的序号
            if (j == needleLength-1){
                return i-j;
            }

            i++;
            j++;

        }


        return -1;
    }

}
